#include <iostream>
#include <string>
#include "user.pb.h"
#include "mprpcapplication.h"
#include "rpcprovider.h"

/*
Userservice原来是一个本地服务，提供了连哥哥进程内的本地方法，LOGIN 和 getFriendLists
*/
// 作用域作用域
// caller -> Login(loginRequest) => muduo==> callee
// callee ==> Login(loginRequest) =>交到下面重写得这个Login方法
class Userservice : public fixbug::UserServiceRpc
{
public:
    bool Login(std::string username, const std::string password)
    {
        std::cout << " doing local service:login" << std::endl;
        std::cout << "name:" << username << "pwd:" << password << std::endl;
        return false;
    }
    bool Register(uint32_t id, std::string username, std::string password)
    {
        std::cout << " doing local service:register" << std::endl;
        std::cout << "id" << id << "name:" << username << "pwd:" << password << std::endl;
        return false;
    }
    // 从写基类文件UserServiceRpc的虚函数 下面这些方法都是框架直接调用的
    void Login(::google::protobuf::RpcController *controller,
               const ::fixbug::LoginRequest *request,
               ::fixbug::LoginResponse *response,
               ::google::protobuf::Closure *done)
    {
        std::string name = request->name();
        std::string pwd = request->pwd();
        // 做本地业务
        bool login_result = Login(name, pwd);
        // 填充响应 响应 错误码 错误消息
        fixbug::ResultCode *code = response->mutable_result();
        code->set_errcode(0);
        code->set_errmsg("");
        response->set_success(login_result);

        // 执行回调函数 执行响应数据的序列化 和发送数据（框架来完成得）
        done->Run();
    }

    void Register(::google::protobuf::RpcController *controller,
                  const ::fixbug::RegisterRequest *request,
                  ::fixbug::RegisterResponse *response,
                  ::google::protobuf::Closure *done)
    {
        uint32_t id = request->id();
        std::string name = request->name();
        std::string pwd = request->pwd();

        bool ret = Register(id, name, pwd);
        response->mutable_result()->set_errcode(1);
        response->mutable_result()->set_errmsg("");
        response->set_success(ret);

        done->Run();
    }
};

// 这里其实就是想把Userservice 发布出去，是单独部署
int main(int argc, char *argv[])
{
    // 先调用框架的初始化工作,知道ip port // provider -i config.conf
    MprpcApplication::Init(argc, argv);

    // 使用muduo库
    RpcProvider provider;
    // 发布一个服务
    provider.NotifyService(new Userservice());
    // 启动服务 启动一个rpc服务发布节点 run以后，进程进入阻塞状态，等待远程得rpc调用请求
    provider.Run();

    return 0;
}
